/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.uniscol.siecle.dao.impl;

import fr.uniscol.dao.UniscolDaoSupport;
import static fr.uniscol.dao.impl.SQLNames.*;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.RapportTraitement;
import fr.uniscol.model.RapportTraitementImportSTS;
import fr.uniscol.siecle.dao.IDonneesSIECLESTSDao;
import fr.uniscol.siecle.dao.IImportDonneesSIECLEDao;
import fr.uniscol.siecle.model.CorrespondanceSiecleSts;
import fr.uniscol.siecle.model.Discipline;
import fr.uniscol.siecle.model.Division;
import fr.uniscol.siecle.model.FichierSIECLE;
import fr.uniscol.siecle.model.FichierSTS;
import fr.uniscol.siecle.model.Groupe;
import fr.uniscol.siecle.model.Individu;
import fr.uniscol.siecle.model.ProfesseurPrincipal;
import fr.uniscol.siecle.model.ServiceSTS;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

/**
 *
 * @author Christophe
 */
@Repository("donneesSTSDao")
public class DonneesSIECLESTSDaoImpl extends UniscolDaoSupport implements IDonneesSIECLESTSDao, IImportDonneesSIECLEDao {
    
    public static Logger log = Logger.getLogger(DonneesSIECLESTSDaoImpl.class);
    
    @Autowired
    private CorrespondanceSIECLESTSDaoImpl correspondancesSiecleStsDao;
    
    @Override
	public boolean saveFichierSIECLE(BaseAnneeScolaire base, FichierSIECLE fichier, RapportTraitement rapport){
		
		FichierSTS model = (FichierSTS) fichier;
		
		int nbRowsAffected = -1;
		
		/*getJdbcTemplate().update("DELETE FROM sts_service_enseignant WHERE annee=? AND etablissementid=? ", new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId()
		});
		getJdbcTemplate().update("DELETE FROM sts_professeur_principal WHERE annee=? AND etablissementid=? ", new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId()
		});
		getJdbcTemplate().update("DELETE FROM sts_discipline_individu WHERE annee=? AND etablissementid=? ", new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId()
		});
		getJdbcTemplate().update("DELETE FROM sts_groupe WHERE annee=? AND etablissementid=? ", new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId()
		});
		getJdbcTemplate().update("DELETE FROM sts_division WHERE annee=? AND etablissementid=? ", new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId()
		});
		getJdbcTemplate().update("DELETE FROM sts_individu WHERE annee=? AND etablissementid=? ", new Object[]{
			base.getAnnee(), 
			base.getEtablissement().getId()
		});
		*/
        
        nbRowsAffected = getJdbcTemplate().update("DELETE FROM " + TABLE_SERVICE_ENSEIGNANT + " WHERE baseid=? ", new Object[]{
            base.getId()
        });
        
        rapport.logInfo(nbRowsAffected + " service(s) supprimé(s).");
        
		boolean enregistrementSTSOK = true;
		for(Individu ind : model.getIndividus()){
			enregistrementSTSOK &= saveIndividu(base, model, ind, rapport);
		}
        
		for(Division div : model.getStructures()){
			enregistrementSTSOK &= saveStructure(base, model, div, rapport);
		}
        
        rapport.logInfo(rapport.getAttributeValue("nbServicesEnregistres") + " service(s) enregistré(s)");
        
		return enregistrementSTSOK;
	}

	private boolean saveStructure(BaseAnneeScolaire base, FichierSTS model, Division div, RapportTraitement rapport) {
		
		/*String reqInsert = "INSERT INTO sts_division (annee, etablissementid, code, libelle_long, effectif_prevu, effectif_calcule) "
				+ "VALUES(?, ?, ?, ?, ?, ?)";
		
		if(div instanceof Groupe){
			reqInsert = "INSERT INTO sts_groupe(annee, etablissementid, code, libelle_long, effectif_prevu, effectif_calcule)"
					+ "VALUES(?, ?, ?, ?, ?, ?)";
		}
		
		int nbRowsAffected = getJdbcTemplate().update(reqInsert, new Object[]{
				base.getAnnee(), 
				base.getEtablissement().getId(),
				div.getCode(),
				div.getLibelle_long(),
				div.getEffectif_calcule(),
				div.getEffectif_calcule()
		});
		
		if(nbRowsAffected != 1){
			return false;
		}
		*/
        CorrespondanceSiecleSts cor = correspondancesSiecleStsDao.findByIdSts(base, div.getCode(), CorrespondanceSiecleSts.CORRESPONDANCE_DIVISION);
        if(cor != null){
            div.setCode(cor.getIdSiecle());
        }
        
		boolean enregistrementServicesOK = true;
        boolean tmp = false;
		for(ServiceSTS ser : div.getServices()){
            
            tmp = saveServiceEnseignant(base, model, div, ser, rapport);
			enregistrementServicesOK &= tmp;
          
            if(tmp){
                rapport.incIntegerAttribute(1, "nbServicesEnregistres");
            }
		}
        
		return enregistrementServicesOK;
	}

	private boolean saveServiceEnseignant(BaseAnneeScolaire base, FichierSTS model, Division div, ServiceSTS ser, RapportTraitement rapport) {
		
        CorrespondanceSiecleSts cor = null;
		
		for(Individu ens : ser.getEnseignants()){
			/*int nbRowsAffected = getJdbcTemplate().update("INSERT INTO sts_service_enseignant (annee, etablissementid, "
					+ "																			code_structure, type_structure,"
					+ "																			code_matiere, enseignant_id, code_modalite_cours, co_ens, heures_structure)"
					+ "VALUES(?, ?, "
					+ "																			?, ?,"
					+ "																			?, ?, ?, ?, ?)", new Object[]{
							base.getAnnee(), 
							base.getEtablissement().getId(),
							div.getCode(),
							(div instanceof Groupe)?"GP" : "DI",
							ser.getMatiere().getCode(),
							ens.getId(),
							ser.getModaliteCours().getCode(),
							ser.getCo_ens(),
							ser.getHeures_structure()
					});
			
			if(nbRowsAffected != 1){
				return false;
			}*/
            
            long structureId = getJdbcTemplate().queryForObject("SELECT getStructureIdByIdSiecle(?,?)", new Object[]{
               base.getId(),
               div.getCode()
            }, Long.class);
            
            if(structureId == 0){
                log.error("La struture '" + div.getCode() + "' est introuvable !");
                
                rapport.logErreur("La struture '" + div.getCode() + "' est introuvable !");
                if(div instanceof Groupe){
                    ((RapportTraitementImportSTS) rapport).addCorrespondanceGroupe(null, div.getCode());
                }else{
                    ((RapportTraitementImportSTS) rapport).addCorrespondanceClasse(null, div.getCode());
                }
            }
            
            long matiereId = getJdbcTemplate().queryForObject("SELECT getMatiereIdByIdSiecle(?,?) ", new Object[]{
               base.getId(),
               ser.getMatiere().getCode()
            }, Long.class);
            
            if(matiereId == 0){
                log.error("La matière '" + ser.getMatiere().getCode() + "' est introuvable");
                
                rapport.logErreur("La matière '" + ser.getMatiere().getCode() + "' est introuvable");
                ((RapportTraitementImportSTS) rapport).addCorrespondanceMatiere(null, ser.getMatiere().getCode());
            }
            
            if(structureId == 0 || matiereId == 0){
                return false;
            }
            
            int nbRowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_SERVICE_ENSEIGNANT + " (baseid,enseignantid,matiereid,structureid,heures) VALUES(?,getEnseignantIdByIdSiecle(?,?),?,?,?)", new Object[]{
               base.getId(),
               base.getId(),
               ens.getId(),
               matiereId,
               structureId,
               ser.getHeures_structure()
            });
            
            if(nbRowsAffected != 1){
                return false;
            }
		}
		
		return true;
	}

	private boolean saveIndividu(BaseAnneeScolaire base, FichierSTS model, Individu ind, RapportTraitement rapport) {
		
		/*int nbRowsAffected = getJdbcTemplate().update("INSERT INTO sts_individu (annee, etablissementid, id, "
				+ "																 type, sexe, code_civilite, nom_usage, nom_patronymique, prenom, date_naissance, grade, fonction)"
				+ "										VALUES(?, ?, ?, "
				+ "																 ?, ?, ?, ?, ?, ?, ?, ?, ?)", new Object[]{
						base.getAnnee(), 
						base.getEtablissement().getId(),
						ind.getId(),
						ind.getType(),
						ind.getSexe(),
						ind.getCivilite().getCode(),
						ind.getNom_usage(),
						ind.getNom_patronymique(),
						ind.getPrenom(),
						ind.getDate_naissance(),
						ind.getGrade(),
						ind.getFonction()
				});
		
		if(nbRowsAffected != 1){
			return false;
		}
		
		boolean enregistrementServicesOK = true;
		for(ProfesseurPrincipal pp : ind.getProfesseursPrincipal()){
			enregistrementServicesOK &= saveProfesseurPrincipal(base, model, ind, pp);
		}
		for(Discipline di : ind.getDisciplines()){
			enregistrementServicesOK &= saveDiscipline(base, model, ind, di);
		}*/
        int nbRowsAffected = getJdbcTemplate().update("UPDATE " + TABLE_ENSEIGNANT + " SET nom=?,prenom=? WHERE baseid=? AND id_siecle=? ", new Object[]{
           ind.getNom_usage(),
           ind.getPrenom(),
           base.getId(),
           ind.getId()
        });
        
        if(nbRowsAffected == 0){
            nbRowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_ENSEIGNANT + " (baseid,nom,prenom,id_siecle) VALUES(?,?,?,?)", new Object[]{
               base.getId(),
               ind.getNom_usage(),
               ind.getPrenom(),
               ind.getId()
            });
        }
        
        if(nbRowsAffected == 0){
            rapport.logErreur("Enseignant '" + ind.getId() + " - "+ ind.getNom_usage() + "' n'a pas été importé");
        }
        
		return nbRowsAffected == 1;
	}
/*
	private boolean saveProfesseurPrincipal(BaseAnneeScolaire base, FichierSTS model, Individu ind, ProfesseurPrincipal pp) {
		
		int nbRowsAffected = getJdbcTemplate().update("INSERT INTO sts_professeur_principal (annee, etablissementid, enseignant_id, "
				+ "																			 code_structure, type_structure, "
				+ "																			 date_debut, date_fin)"
				+ "	VALUES(?,?,?,?,?,?,?)", new Object[]{
						base.getAnnee(), 
						base.getEtablissement().getId(),
						ind.getId(),
						pp.getStructure().getCode(),
						(pp.getStructure() instanceof Groupe)? "GP" : "DI",
						pp.getDate_debut(),
						pp.getDate_fin()
				});
		
		return nbRowsAffected == 1;
	}

	private boolean saveDiscipline(BaseAnneeScolaire base, FichierSTS model, Individu ind, Discipline di) {
		
		int nbRowsAffected = getJdbcTemplate().update("INSERT INTO sts_discipline_individu (annee, etablissementid, enseignant_id, code_discipline, libelle_court, nb_heures)"
				+ "VALUES(?, ?, ?, ?, ?, ?)", new Object[]{
						base.getAnnee(), 
						base.getEtablissement().getId(),
						ind.getId(),
						di.getCode(),
						di.getLibelle_court(),
						di.getNb_heures()
				});
		
		return nbRowsAffected == 1;
	}*/
}
